// import com.alibaba.druid.sql.ast.*;
// import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
// import com.alibaba.druid.sql.ast.expr.SQLQueryExpr;
// import com.alibaba.druid.sql.ast.statement.*;
// import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerOutput;
// import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerTop;
// import com.alibaba.druid.sql.dialect.sqlserver.ast.stmt.*;
// import com.alibaba.druid.sql.dialect.sqlserver.ast.stmt.SQLServerExecStatement.SQLServerParameter;
// import com.alibaba.druid.sql.parser.*;
// import com.alibaba.druid.util.FnvHash;

// import java.util.Collection;
// import java.util.List;
#pragma once
#include "../../../parser/SQLStatementParser.h"

class SQLServerStatementParser : virtual public SQLStatementParser
{
public:
  SQLServerStatementParser(string_ptr sql);

  SQLServerStatementParser(string_ptr sql, SQLParserFeature_list_ptr features);

  SQLSelectParser_ptr createSQLSelectParser();

  SQLServerStatementParser(Lexer_ptr lexer);

  BOOL_ptr parseStatementListDialect(SQLStatement_list_ptr statementList);

  /**
   * SQLServer parse Parameter statement support out type
   */
  void parseExecParameter(SQLServerExecStatement_SQLServerParameter_list_ptr exprCol, SQLObject_ptr parent);

  SQLStatement_ptr parseDeclare();

  SQLStatement_ptr parseInsert();

  void parseInsert0(SQLInsertInto_ptr insert, BOOL_ptr acceptSubQuery);

  SQLUpdateStatement_ptr createUpdateStatement();

  SQLUpdateStatement_ptr parseUpdateStatement();

  // @Override
  SQLServerExprParser_ptr getExprParser();

  SQLStatement_ptr parseSet();

  SQLIfStatement_ptr parseIf();

  SQLStatement_ptr parseBlock();

  SQLStatement_ptr parseCommit();

  SQLStatement_ptr parseRollback();

  SQLServerWaitForStatement_ptr parseWaitFor();

  void parseAlterDrop(SQLAlterTableStatement_ptr stmt);
};
